﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 方法参数修饰符
{
    internal class Program
    {
        static void Main(string[] args)
        {
            //为什么ref必须在调用的时候加上呢？
            //因为方法的调用者，如果不加ref的话，可能会以为本方法不会改变实际参数
            //强迫调用者加ref，可以让其清醒的认识到，本方法可能改变实际参数

            //int a = 10;
            //DoubleIt(ref a);
            //Console.WriteLine(a);

            //int a = 10;
            //InExample(in a);
            //Console.Read();

            //int width = 800;
            //int height = 600;

            //为什么不加in关键字也不会报错呢？
            //传入的变量，一定会作为只读变量，在方法内部绝对不会被更改，所以放心大胆的省略掉in
            //PlayerMove(in width,in height);


            int b = 100;
            OutExample(out b);
            Console.WriteLine(b);
            Console.Read();
        }

        public static void DoubleIt(ref int Val)
        {
            Val = Val * 2;
        }

        public static void InExample(in int Val)
        {
            Console.WriteLine(Val);
            int Val1 = Val + 5;
        }

        //玩家移动的时候，其实是改变了其xy的坐标
        //玩家移动的时候，xy坐标不能超过地图的界限
        public static void PlayerMove(in int width, in int height)
        {
            int x = 10;
            int y = 10;

            x++;
            y++;

            if (x > width || y > height)
            {
                Console.WriteLine("玩家越界了");
            }
        }

        public static void OutExample(out int Val)
        {
            Val = 10;
            Val *= 2;
        }
    }
}
